#pragma once
#include"mutex.hpp"
#include"User.hpp"
#include"InetAddr.hpp"
#include"log.hpp"

using namespace MutexModule;
class UserManager
{
public:
    UserManager()
    {
    }
    ~UserManager()
    {
    }
    void AddUser(InetAddr &id) // 增加用户到我们的链表中
    {
        LockGuard lockguard(_mutex);
        for (auto &it : _users)
        {
            if (*it == id) // 代表之前存在该用户
            {
                LOG(LogLevel::DEBUG) << id.Addr() << "该用户已经存在，无法添加";
                return;
            }
        }
        LOG(LogLevel::DEBUG) << "Add user: " << id.Addr();
        _users.emplace_back(std::make_shared<User>(id)); // 如果不存在，就添加该用户
    }
    void DelUser(InetAddr &id) // 删除用户
    {
        
         auto pos = std::remove_if(_users.begin(), _users.end(), [&id](std::shared_ptr<UserInterface> &user){
            return *user == id;
        });
        _users.erase(pos, _users.end());
        PrintUser();
    }
     void PrintUser()
    {
        for(auto user : _users)
        {
            LOG(LogLevel::DEBUG) <<"在线用户-> "<<  user->GetId();
        }
    }

    void Router(int sockfd,  std::string message)
    {
        LockGuard lockguard(_mutex);
        for (auto &it : _users)
        {
            it->Sendto(sockfd, message); // 调用每个用户的Sendto方法发送消息
        }
    }

private:
    Mutex _mutex;
    std::list<std::shared_ptr<UserInterface>> _users; // 存储用户的列表,我们这里用基类指针（或引用）指向子类对象，实现多态
};
